package com.jnxg.smartcommunity.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.util.AttributeSet;
import android.widget.ImageView;

import com.jnxg.smartcommunity.R;


public class RoundImageView extends ImageView {
	/** 
	 * 鍦嗗舰ImageView锛屽彲璁剧疆鏈�涓や釜瀹藉害涓嶅悓涓旈鑹蹭笉鍚岀殑鍦嗗舰杈规銆�?
	 * 璁剧疆棰滆壊鍦▁ml甯冨眬鏂囦欢涓敱鑷畾涔夊睘鎬ч厤缃弬鏁版寚�?�?
	 */ 
	    private int mBorderThickness = 0; 
	    private Context mContext; 
	    private int defaultColor = 0xFFFFFFFF; 
	    // 濡傛灉鍙湁鍏朵腑涓�釜鏈夊�锛屽垯鍙敾涓�釜鍦嗗舰杈规 
	    private int mBorderOutsideColor = 0; 
	    private int mBorderInsideColor = 0; 
	    // 鎺т欢榛樿闀裤�瀹�
	    private int defaultWidth = 0; 
	    private int defaultHeight = 0; 
	   
	    public RoundImageView(Context context) { 
	        super(context); 
	        mContext = context; 
	    } 
	   
	    public RoundImageView(Context context, AttributeSet attrs) { 
	        super(context, attrs); 
	        mContext = context; 
	        setCustomAttributes(attrs); 
	    } 
	   
	    public RoundImageView(Context context, AttributeSet attrs, int defStyle) { 
	        super(context, attrs, defStyle); 
	        mContext = context; 
	        setCustomAttributes(attrs); 
	    } 
	   
	    private void setCustomAttributes(AttributeSet attrs) {
	        TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.roundedimageview);
	        mBorderThickness = a.getDimensionPixelSize(R.styleable.roundedimageview_border_thickness, 0); 
	        mBorderOutsideColor = a.getColor(R.styleable.roundedimageview_border_outside_color,defaultColor); 
	        mBorderInsideColor = a.getColor(R.styleable.roundedimageview_border_inside_color, defaultColor); 
	    } 
	   
	    @Override 
	    protected void onDraw(Canvas canvas) { 
	        Drawable drawable = getDrawable() ;  
	        if (drawable == null) { 
	            return; 
	        } 
	        if (getWidth() == 0 || getHeight() == 0) { 
	            return; 
	        } 
	        this.measure(0, 0); 
	        if (drawable.getClass() == NinePatchDrawable.class) 
	            return; 
	        Bitmap b = ((BitmapDrawable) drawable).getBitmap(); 
	        Bitmap bitmap = b.copy(Config.ARGB_8888, true);
	        if (defaultWidth == 0) { 
	            defaultWidth = getWidth(); 
	        } 
	        if (defaultHeight == 0) { 
	            defaultHeight = getHeight(); 
	        } 
	        int radius = 0; 
	        if (mBorderInsideColor != defaultColor && mBorderOutsideColor != defaultColor) {// 瀹氫箟鐢讳袱涓竟妗嗭紝鍒嗗埆涓哄鍦嗚竟妗嗗拰鍐呭渾杈规 
	            radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - 2 * mBorderThickness; 
	            // 鐢诲唴鍦�?
	            drawCircleBorder(canvas, radius + mBorderThickness / 2,mBorderInsideColor); 
	            // 鐢诲鍦�?
	            drawCircleBorder(canvas, radius + mBorderThickness + mBorderThickness / 2, mBorderOutsideColor); 
	        } else if (mBorderInsideColor != defaultColor && mBorderOutsideColor == defaultColor) {// 瀹氫箟鐢讳竴涓竟妗�?
	            radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness; 
	            drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor); 
	        } else if (mBorderInsideColor == defaultColor && mBorderOutsideColor != defaultColor) {// 瀹氫箟鐢讳竴涓竟妗�?
	            radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness; 
	            drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderOutsideColor); 
	        } else {// 娌℃湁杈规 
	            radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2; 
	        } 
	        Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius); 
	        canvas.drawBitmap(roundBitmap, defaultWidth / 2 - radius, defaultHeight / 2 - radius, null); 
	    } 
	   
	    /** 
	     * 鑾峰彇瑁佸壀鍚庣殑鍦嗗舰鍥剧�?
	     */
	    public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) { 
	        Bitmap scaledSrcBmp; 
	        int diameter = radius * 2; 
	        // 涓轰簡闃叉瀹介珮涓嶇浉绛夛紝閫犳垚鍦嗗舰鍥剧墖鍙樺舰锛屽洜姝ゆ埅鍙栭暱鏂瑰舰涓浜庝腑闂翠綅缃渶澶х殑姝ｆ柟褰㈠浘鐗�?
	        int bmpWidth = bmp.getWidth(); 
	        int bmpHeight = bmp.getHeight(); 
	        int squareWidth = 0, squareHeight = 0; 
	        int x = 0, y = 0; 
	        Bitmap squareBitmap; 
	        if (bmpHeight > bmpWidth) {// 楂樺ぇ浜庡 
	            squareWidth = squareHeight = bmpWidth; 
	            x = 0; 
	            y = (bmpHeight - bmpWidth) / 2; 
	            // 鎴彇姝ｆ柟褰㈠浘鐗�?
	            squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight); 
	        } else if (bmpHeight < bmpWidth) {// 瀹藉ぇ浜庨珮 
	            squareWidth = squareHeight = bmpHeight; 
	            x = (bmpWidth - bmpHeight) / 2; 
	            y = 0; 
	            squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,squareHeight); 
	        } else { 
	            squareBitmap = bmp; 
	        } 
	        if (squareBitmap.getWidth() != diameter || squareBitmap.getHeight() != diameter) { 
	            scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter,diameter, true); 
	        } else { 
	            scaledSrcBmp = squareBitmap; 
	        } 
	        Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(), 
	                scaledSrcBmp.getHeight(),  
	                Config.ARGB_8888); 
	        Canvas canvas = new Canvas(output); 
	   
	        Paint paint = new Paint(); 
	        Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(),scaledSrcBmp.getHeight()); 
	   
	        paint.setAntiAlias(true); 
	        paint.setFilterBitmap(true); 
	        paint.setDither(true); 
	        canvas.drawARGB(0, 0, 0, 0); 
	        canvas.drawCircle(scaledSrcBmp.getWidth() / 2, 
	                scaledSrcBmp.getHeight() / 2,  
	                scaledSrcBmp.getWidth() / 2, 
	                paint); 
	        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
	        canvas.drawBitmap(scaledSrcBmp, rect, rect, paint); 
	        bmp = null; 
	        squareBitmap = null; 
	        scaledSrcBmp = null; 
	        return output; 
	    } 
	   
	    /** 
	     * 杈圭紭鐢诲渾 
	     */ 
	    private void drawCircleBorder(Canvas canvas, int radius, int color) { 
	        Paint paint = new Paint(); 
	        /* 鍘婚敮榻�?/ 
	        paint.setAntiAlias(true); 
	        paint.setFilterBitmap(true); 
	        paint.setDither(true); 
	        paint.setColor(color); 
	        /* 璁剧疆paint鐨勩�style銆�负STROKE锛氱┖蹇�?/ 
	        paint.setStyle(Paint.Style.STROKE); 
	        /* 璁剧疆paint鐨勫妗嗗搴�*/ 
	        paint.setStrokeWidth(mBorderThickness); 
	        canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint); 
	    } 
	  
}